package com.zhanghp.class030;

/**
 * 数组中只有1种数出现次数少于m次，其他数都出现了m次
 * 返回出现次数小于m次的那种数
 * 测试链接 : https://leetcode.cn/problems/single-number-ii/
 * 注意 : 测试题目只是通用方法的一个特例，课上讲了更通用的情况
 *
 * @author zhanghp
 * @since 2024/4/3 17:31
 */
public class Code06_OneKindNumberLessMtimes {

    static class Solution {
        public int singleNumber(int[] nums) {
            return find(nums, 3);
        }

        public int find(int[] nums, int m){
            // 把所有nums数组里的数，变成32位进制各个相加
            int[] ints = new int[32];
            // cnts[0] : 0位上有多少个1
            // cnts[i] : i位上有多少个1
            // cnts[31] : 31位上有多少个1
            for (int num : nums) {
                for (int i = 0; i < ints.length; i++) {
                    ints[i] += ((num >> i) & 1);
                }
            }

            // 组合
            int ans = 0;
            for (int i = 0; i < ints.length; i++) {
                // 所有数组指定i位置的二进制的1加起来
                // 除m有余数就是该数
                // 组合一下
                if (ints[i] % m != 0) {
                    ans |= (1 << i);
                }
            }
            return ans;
        }
    }
}
